package de.mnit.basis.daten.typ;

import de.mnit.basis.daten.S_Vergleichbar;
import de.mnit.basis.fehler.Fehler;


/**
 * @author Michael Nitsche
 */
public class Vergleich {

	@SuppressWarnings("unchecked")
	public static boolean istGleich(Object o1, Object o2) {
		if(o1==null && o2==null)
			return true;
		if(o1==null || o2==null)
			return false;
		if(o1.getClass() != o2.getClass())
			return false;
		if(o1 instanceof S_Vergleichbar)
			return ((S_Vergleichbar)o1).istGleich(o2);
		if(o1 instanceof Comparable)
			return ((Comparable)o1).compareTo(o2)==0;
		return o1.equals(o2);
	}

	public static boolean istKleiner(Object das, Object als) {
		return istGroesser(als, das);
	}

	@SuppressWarnings("unchecked")
	public static boolean istGroesser(Object das, Object als) {
		if(istGleich(das,als))
			return false;
		if(das!=null && als==null)
			return true;
		if(das==null && als!=null)
			return false;
		if(das instanceof String && als instanceof String)
			return istGroesserDeutsch((String)das, (String)als);
		if(das instanceof S_Vergleichbar && als instanceof S_Vergleichbar)
			return ((S_Vergleichbar)das).istGroesser(als);
		if(das.getClass()==als.getClass())
			if(das instanceof Comparable && als instanceof Comparable)
				return ((Comparable)das).compareTo((Comparable)als)>0;
		throw Fehler.sonstige.da_ToDo("Derzeit nicht vergleichbar",das,als);
	}

	public static boolean istGroesserDeutsch(String s1, String s2) {
		Fehler.objekt.wenn_Null(s1, s2);
		Boolean erg = iIstGroesserDeutsch(s1, s2);
		return erg!=null ? erg : s1.compareTo(s2)<0;
	}

	// INTERN

	private static char iUmlautKorrektur(char c) {
		if(c>='a' && c<='z') return (char)(c-'a'+'A');
		if(c=='Ä' || c=='ä') return 'A';
		if(c=='Ö' || c=='ö') return 'O';
		if(c=='Ü' || c=='ü') return 'U';
		return c;
	}

	private static Boolean iIstGroesserDeutsch(String s1, String s2) {
		Fehler.objekt.wenn_Null(s1, s2);
		int min = Math.min(s1.length(), s2.length());
		for(int i=0; i<min; i++) {
			char c1=s1.charAt(i);
			char c2=s2.charAt(i);
			char v1=iUmlautKorrektur(c1);
			char v2=iUmlautKorrektur(c2);

			if(v1 != v2)
				return v1>v2;
		}
		if(s1.length()!=s2.length())
			return s1.length()>s2.length();
		int sx=s1.compareTo(s2);
		if(sx!=0)
			return sx>0;

		return null;
	}

}
